package com.jp.refreshlocalcacheserver.net.netty.session;


import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @Author: jipeng
 * @Description:
 * @Date: Created in 2020/5/14 9:57
 */
public class ActiveSessionRegistry {

    /**
     * 保存服务器对应的 ChannelHandlerContext
     * key 是 ChannelHandlerContext 的 hasCode
     */
    private static Map<Integer, SessionData> serverSession = new HashMap<>();

    /**
     * 缓存key 和 对应的 通道（服务器）
     * 发送同步通知的时候，需要知道同步的key在那些机器上
     */
    private static Map<String, List<Integer>> cacheKeyAndChannels = new HashMap<>();




    /**
     * 获取会话数据
     * @param channelId
     * @return
     */
    public static SessionData getSessionData(int channelId){
        return serverSession.get(channelId);
    }


    /**
     * 添加会话数据
     * @param sessionData
     */
    public static void addSessionData(SessionData sessionData){
        serverSession.put(sessionData.getChannelId(),sessionData);
    }

    /**
     * 删除会话数据
     * @param channelId
     */
    public static void deleteSessionData(int channelId){
        SessionData sessionData = serverSession.get(channelId);
        if(sessionData == null){
            return;
        }

        //删除 缓存key和通道的关系 数据
        List<Integer> tempChannelIds;
        for(String cacheKey : sessionData.getServerCacheKey()){
            //根据缓存key 获取 channelId
            tempChannelIds = cacheKeyAndChannels.get(cacheKey);

            if(tempChannelIds != null){
                // channelId list 不为空 则移除当前channelId
                tempChannelIds.remove(channelId);
            }
        }

        //删除会话数据
        serverSession.remove(channelId);
    }

    /**
     * 添加 缓存key 和 通道ID的关联
     * @param cacheKey
     * @param channelId
     */
    public static void addCacheKeyAndChannels(String cacheKey, Integer channelId){

        List<Integer> temp = null;
        if((temp = cacheKeyAndChannels.get(cacheKey)) == null){
            //存在并发，锁操作
            synchronized (cacheKey) {
                if((temp = cacheKeyAndChannels.get(cacheKey)) == null) {
                    temp = new ArrayList<>();
                    cacheKeyAndChannels.put(cacheKey, temp);
                }
            }
        }
        temp.add(channelId);
    }

    /**
     * 根据缓存key 获取链接通道
     * @param cacheKey
     * @return
     */
    public static List<Integer> getChannelIdByCacheKey(String cacheKey){
        return cacheKeyAndChannels.get(cacheKey);
    }
}
